home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_87 / exeloade.pas < prev    next >
Pascal/Delphi Source File  |  1995-01-01  |  3KB  |  142 lines

  1. UNIT ExeLoader;
  2.  
  3. INTERFACE
  4.  
  5. USES Objects, SongUnit;
  6.  
  7.  
  8.  
  9.  
  10. PROCEDURE LoadExeFileFormat(VAR Song: TSong; VAR St: TStream; VAR Header: TSongHeader);
  11.  
  12.  
  13.  
  14.  
  15. IMPLEMENTATION
  16.  
  17. USES SongElements, SongUtils, S3mLoader, Heaps, AsciiZ;
  18.  
  19.  
  20.  
  21.  
  22. TYPE
  23.   TExeFileMagic = ARRAY[0..1] OF CHAR;
  24.  
  25.   TFCDir =
  26.     RECORD
  27.       Name : ARRAY[1..16] OF CHAR;
  28.       Pos  : LONGINT;
  29.       Size : LONGINT;
  30.     END;
  31.  
  32. CONST
  33.   ExeMagic : TExeFileMagic = ( 'M', 'Z' );
  34.  
  35.   ThereIsMore : BOOLEAN = FALSE;
  36.  
  37. VAR
  38.   LastIndex : WORD;
  39.  
  40.  
  41.  
  42.  
  43.  
  44. PROCEDURE LoadExeFileFormat(VAR Song: TSong; VAR St: TStream; VAR Header: TSongHeader);
  45.   CONST
  46.     MaxDir = 100;
  47.   VAR
  48.     Dir   : ARRAY[1..MaxDir] OF TFCDir;
  49.     Magic : TExeFileMagic ABSOLUTE Header;
  50.     DirPos, l,
  51.     NumEntrys : LONGINT;
  52.     s         : STRING[12];
  53.     i, j, siz : WORD;
  54.     NumDir    : WORD;
  55.   LABEL
  56.     Error;
  57.   BEGIN
  58.     IF (Magic <> ExeMagic) OR (St.GetPos <> 0) THEN
  59.       BEGIN
  60. Error:
  61.         ThereIsMore := FALSE;
  62.         Song.Status := msNotLoaded;
  63.         EXIT;
  64.       END;
  65.  
  66.     St.Seek(St.GetSize - 4);
  67.     St.Read(DirPos, 4);
  68.  
  69.     IF (DirPos > St.GetSize) OR (DirPos <= 0) THEN GOTO Error;
  70.  
  71.     St.Seek(DirPos);
  72.     St.Read(l, 4);
  73.     IF l <> 13119424 THEN GOTO Error;
  74.  
  75.     St.Read(NumEntrys, 4);
  76.     St.Read(l, 4);
  77.  
  78.     IF Song.InsidePath <> NIL THEN
  79.       FOR i := 1 TO Length(Song.InsidePath^) DO
  80.         Song.InsidePath^[i] := UpCase(Song.InsidePath^[i]);
  81.  
  82.     DirPos := St.GetPos;
  83.  
  84.     FOR j := 0 TO (NumEntrys + MaxDir - 1) DIV MaxDir - 1 DO
  85.       BEGIN
  86.  
  87.         NumDir := MaxDir;
  88.         IF j*MaxDir + NumDir > NumEntrys THEN
  89.           NumDir := NumEntrys MOD MaxDir;
  90.  
  91.         St.Seek(DirPos);
  92.         St.Read(Dir, NumDir*24);
  93.         DirPos := St.GetPos;
  94.  
  95.         IF ThereIsMore THEN i := LastIndex + 1
  96.                        ELSE i := 1;
  97.  
  98.         IF i <= j*MaxDir THEN i := j*MaxDir;
  99.  
  100.         IF i < NumDir + j*MaxDir THEN
  101.           FOR i := i - j*MaxDir TO NumDir DO
  102.             BEGIN
  103.               Song.Status := msNotLoaded;
  104.               s           := StrAsciiZ(Dir[i].Name, 12);
  105.               WHILE s[Length(s)] = ' ' DO
  106.                 DEC(s[0]);
  107.  
  108.               IF (Song.InsidePath  = NIL) OR
  109.                  (Song.InsidePath^ = '')  OR
  110.                  (Song.InsidePath^ = s)   THEN
  111.                 BEGIN
  112.                   St.Seek(Dir[i].Pos);
  113.                   St.Read(Header, SizeOf(Header));
  114.                   St.Seek(Dir[i].Pos);
  115.  
  116.                   LoadS3mFileFormat(Song, St, Header);
  117.  
  118.                   St.Seek(0);
  119.                   St.Read(Header, SizeOf(Header));
  120.                   St.Seek(0);
  121.  
  122.                   IF (Song.Status <> msNotLoaded)    AND
  123.                      (Song.Status <= msFileTooShort) THEN
  124.                     BEGIN
  125.                       Song.SetInsidePath(s);
  126.  
  127.                       Song.ThereIsMore := TRUE;
  128.                       ThereIsMore      := TRUE;
  129.                       LastIndex        := j*MaxDir + i;
  130.                       EXIT;
  131.                     END;
  132.                 END;
  133.             END;
  134.       END;
  135.  
  136.     ThereIsMore := FALSE;
  137.   END;
  138.  
  139.  
  140.  
  141. END.
  142.